package cxydmmszl.chapter07.t110;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * <li style="color: red;">Prob</li>
 * 不用任何比较判断找出两个数中较大的数
 * <li style="color: green;">Desc</li>
 * 给定两个32位整数 a 和 b，返回 a 和 b 中较大的，
 * 要求不能用任何比较判断运算符。
 * <li style="color: green;">Input</li>
 * 输出两个整数a和b，a和b均为32位整数。
 * <li style="color: green;">Output</li>
 * 输出一个整数，两个数中较大的那一个。
 * <li style="color: blue;">Link</li> CD143
 *
 * @author habitplus
 * @since 2021-10-07 18:09
 */
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] ss = br.readLine().split(" ");
        int a = Integer.parseInt(ss[0]);
        int b = Integer.parseInt(ss[1]);

        int ans = max(a, b);
        System.out.println(ans);
    }


    private static int max(int a, int b) {
        int sa = sign(a);
        int sb = sign(a);
        int sc = sign(a - b);

        // 1. 如果 a，b 符号位不同，difSign = 1, sameSign = 0, 则：
        //      1.1 如果 a 为 0 或正数，那么 b 为负数，sa = 1, sb = 0; 应该返回 a；
        //      1.2 如果 a 为负数，那么 b 为 0 或正数，sa = 0, sb = 1; 应该返回 b；
        // 2. 如果 a，b 符号相同，difSign = 0, sameSign = 1， 这种情况下 a-b 一定不会溢出，则：
        //      2.1 如果 a-b 为 0 或正数，sc = 1，返回 a；
        //      2.2 如果 a-b 为负数，sc = 0，返回 b；
        int difSign = sa ^ sb;
        int sameSign = flip(difSign);

        int returnA = difSign * sa + sameSign * sc;
        int returnB = flip(returnA);

        return a * returnA + b * returnB;
    }

    private static int flip(int n) {
        return n ^ 1;
    }

    private static int sign(int a) {
        return flip((a >> 31) & 1);
    }
}
